﻿using CleanToolkit.Comparison.DiffModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace CleanToolkit.Comparison.Comparers
{
    class FieldsFormulaComparer : IFieldsComparer
    {
        /// <summary>
        /// Retourne les différences de formule de calcul 
        /// * si la formule est présente dans l'élément d'origine et absente dans l'élément de comparaison
        /// * si les formules sont présentes dans les 2 éléments mais avec des valeurs différentes
        /// </summary>
        /// <param name="orgElt"></param>
        /// <param name="compElt"></param>
        /// <returns></returns>
        public IEnumerable<FieldDiffInfo> Compare(XElement orgElt, XElement compElt)
        {
            // Préparation de la structure de retour
            List<FieldDiffInfo> result = new List<FieldDiffInfo>();
            //-------------------------------------------------------------------------------


            // On récupère la formule si elle existe sur l'élément d'origine
            XElement orgFormula = orgElt.Elements(CleanConstants.CST_SpNamespace + "Formula").FirstOrDefault();


            if (orgFormula != null)
            {
                // On récupère la formule si elle existe sur l'élément de comparaison
                XElement compFormula = compElt.Elements(CleanConstants.CST_SpNamespace + "Formula").FirstOrDefault();

                if (compFormula == null)
                {
                    // la formule est absente de l'élément de comparaison
                    result.Add(new FormulaMissing()
                    {
                        Name = orgFormula.Name.LocalName,       // Nom de l'attribut
                        Value = orgFormula.Value                // Valeur de la formule
                    });
                }
                else
                {
                    // On compare les formules
                    if (orgFormula.Value != compFormula.Value)
                    {
                        // les valeurs des attributs  diffèrent
                        result.Add(new FormulaValueDiff()
                        {
                            Name = orgFormula.Name.LocalName,   // "Formula"
                            Source = orgFormula.Value,          // Valeur de la formule sur la source
                            Comparison = compFormula.Value      // Valeur de la formule sur la comparaison
                        });
                    }
                    else
                    {
                                    // On rajoute systématiquement les formules
                        result.Add(new Formula()
                        {
                            Name = orgFormula.Name.LocalName,       // Nom de l'attribut
                            Value = orgFormula.Value                // Valeur de la formule
                        });
                    }
                }
            }


            //-------------------------------------------------------------------------------
            return result;
        }
    }
}
